package com.example.javaee.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.boot.ApplicationRunner;
import java.util.Arrays;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
            // 禁用CSRF保护，因为我们的应用目前不需要这个功能
            .csrf(csrf -> csrf.disable())
            // 配置CORS支持，以允许跨域请求
            .cors(cors -> cors.configurationSource(corsConfigurationSource()))
            .authorizeHttpRequests(auth -> auth
                    // 允许所有 /api 路径的请求
                    .requestMatchers("/api/**,/api/login").permitAll()
                    // 允许所有其他路径的请求
                    .requestMatchers("/**").permitAll()
            )
            // 配置HTTP头部选项，禁用frame选项，以防止点击劫持攻击
            .headers(headers -> headers.frameOptions(frame -> frame.disable()));

    // 构建并返回配置好的Security过滤链
    return http.build();
}


    /**
 * 配置跨域资源共享(CORS)的Bean
 * 该方法定义了允许跨域请求的配置
 *
 * @return CorsConfigurationSource 用于提供CORS配置的源
 */
@Bean
public CorsConfigurationSource corsConfigurationSource() {
    // 创建一个新的CORS配置实例
    CorsConfiguration configuration = new CorsConfiguration();

    // 设置允许跨域请求的源，此处仅允许本地开发环境下的请求
    configuration.setAllowedOrigins(Arrays.asList("http://localhost:5173"));

    // 设置允许的HTTP方法，包括GET、POST、PUT、DELETE和OPTIONS
    configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));

    // 设置允许的请求头，此处允许所有请求头
    configuration.setAllowedHeaders(Arrays.asList("*"));

    // 允许请求携带用户凭证（如cookies）
    configuration.setAllowCredentials(true);

    // 预检请求的缓存时间，单位为秒
    configuration.setMaxAge(3600L);

    // 创建一个新的基于URL的CORS配置源
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

    // 将CORS配置注册到所有路径
    source.registerCorsConfiguration("/**", configuration);

    // 返回配置好的CORS配置源
    return source;
}


    @Bean
    public ApplicationRunner applicationRunner() {
        return args -> {
            // 空实现
        };
    }
}